home *** CD-ROM | disk | FTP | other *** search
- Path: uunet!cs.utexas.edu!rutgers!mit-eddie!uw-beaver!zephyr.ens.tek.com!tekred!saab!billr
- From: billr@saab.CNA.TEK.COM (Bill Randle)
- Newsgroups: comp.sources.games
- Subject: v09i027: NetHack3 - display oriented dungeons & dragons (Ver. 3.0), Patch7aa
- Message-ID: <5241@tekred.CNA.TEK.COM>
- Date: 24 Feb 90 01:09:25 GMT
- Sender: news@tekred.CNA.TEK.COM
- Lines: 2437
- Approved: billr@saab.CNA.TEK.COM
-
- Submitted-by: Izchak Miller <izchak@linc.cis.upenn.edu>
- Posting-number: Volume 9, Issue 27
- Archive-name: NetHack3/Patch7aa
- Patch-To: NetHack3: Volume 7, Issue 56-93
-
-
-
- #! /bin/sh
- # This is a shell archive. Remove anything before this line, then unpack
- # it by saving it into a file and typing "sh file". To overwrite existing
- # files, type "sh file -c". You can also feed this as standard input via
- # unshar, or by typing "sh <file", e.g.. If this archive is complete, you
- # will see the following message at the end:
- # "End of archive 27 (of 30)."
- # Contents: others/ovlmgr.asm src/lev_lex.c
- # Wrapped by billr@saab on Wed Feb 21 10:04:50 1990
- PATH=/bin:/usr/bin:/usr/ucb ; export PATH
- if test -f 'others/ovlmgr.asm' -a "${1}" != "-c" ; then
- echo shar: Renaming existing file \"'others/ovlmgr.asm'\" to \"'others/ovlmgr.asm.orig'\"
- mv -f 'others/ovlmgr.asm' 'others/ovlmgr.asm.orig'
- fi
- echo shar: Extracting \"'others/ovlmgr.asm'\" \(30539 characters\)
- sed "s/^X//" >'others/ovlmgr.asm' <<'END_OF_FILE'
- X; SCCS Id: @(#)ovlmgr.asm 3.0.624 90/02/18
- X; Copyright (c) Pierre Martineau and Stephen Spackman, 1989, 1990.
- X; This product may be freely redistributed. See NetHack license for details.
- X
- X PAGE 60,132
- X TITLE 'Overlay manager for use with Microsoft overlay linker'
- X SUBTTL 'Brought to you by Pierre Martineau and Stephen Spackman'
- X
- X; acknowledgements: - No thanks to Microsoft
- X; - alltrsidsctysti!!!
- X; - izchak and friends for impetus
- X; - us for brilliance
- X; - coffee for speed
- X; - others as necessary
- X
- X; assumptions: - all registers are preserved including flags
- X; - the stack is preserved
- X; - re-entrancy is not rEQUired
- X
- XDOSALLOC EQU 48h ; memory allocation
- XDOSFREE EQU 49h ; free allocated memory
- XDOSREALLOC EQU 4ah ; modify memory block
- XDOSREAD EQU 3fh ; read bytes from handle
- XDOSSEEK EQU 42h ; logical handle seek
- XDOSOPEN EQU 3dh ; open handle
- XDOSCLOSE EQU 3eh ; close handle
- XDOSGETVEC EQU 35h ; get interrupt vector
- XDOSSETVEC EQU 25h ; set interrupt vector
- XDOSEXEC EQU 4bh ; exec child process
- XDOS EQU 21h ; Dos interrupt #
- XPRINT EQU 09h ; print string
- XTERMINATE EQU 4ch ; terminate process
- XCR EQU 0dh
- XLF EQU 0ah
- XBELL EQU 07h
- XFAERIE EQU 0h ; Used for dummy segment allocation
- XPARSIZ EQU 10h ; this is the size of a paragraph - this better not change!
- X
- X; The following EXTRNs are supplied by the linker
- X
- XEXTRN $$OVLBASE:BYTE ; segment of OVERLAY_AREA
- XEXTRN $$MPGSNOVL:BYTE ; ^ to module table
- XEXTRN $$MPGSNBASE:WORD ; ^ to module segment fixups
- XEXTRN $$INTNO:BYTE ; interrupt number to be used
- XEXTRN $$COVL:WORD ; number of physical overlays
- XEXTRN $$CGSN:WORD ; number of modules
- XEXTRN $$MAIN:FAR ; ^ to function main()
- X
- XPUBLIC $$OVLINIT ; Our entry point
- X ; called by the c startup code
- X
- Xovlflgrec RECORD running:1=0,locked:1=0,loaded:1=0 ; overlay flags
- X
- X; This is a dirty hack. What we need is a virtual segment that will be built
- X; by the (our) loader in multiple copies, one per overlay. Unfortunately, this
- X; doesn't seem to be a sensible idea in the minds of the folks at Microsoft.
- X; Declaring this segment AT will ensure that it never appears in the exefile,
- X; and ASSUME is dumb enough to be fooled.
- X;
- X; The reason we want to do this is also not-to-be-tried-at-home: it turns out
- X; that we can code a faster interrupt handler if we map overlay numbers to
- X; segment values. Normally I would consider this unacceptable programming
- X; practise because it is 86-mode specific, but the *need* for this entire
- X; programme is 86-mode specific, anyway.
- X
- Xpspseg SEGMENT PARA AT FAERIE ; dummy segment for psp
- X ORG 2ch ; ^ to segment of environmemt in psp
- Xpspenv LABEL WORD
- Xpspseg ENDS
- X
- Xovltbl SEGMENT PARA AT FAERIE ; Dummy segment definition for overlay table
- X
- X; NOTE: This segment definition MUST be exactly 16 bytes long
- X
- Xovlflg ovlflgrec <0,0,0> ; overlay flags
- Xovltblpad1 DB ? ; go ahead, delete me!
- Xovlmemblk DW ? ; ^ to allocated memory block
- Xovllrudat DD ? ; misc lru data (pseudo time stamp)
- Xovlseg DW ? ; ovl segment physical add.
- Xovlfiloff DW ? ; ovl file offset in pages (512 bytes)
- Xovlsiz DW ? ; ovl size in paragraphs
- Xovltblpad DB PARSIZ - ($ - ovlflg) MOD PARSIZ DUP (?) ; pad to 16 bytes
- X
- XIF1
- XIF ($ - ovlflg) GT PARSIZ
- X .ERR
- X %OUT This segment MUST be no more than 16 bytes, REALLY!!!
- XENDIF
- XENDIF
- X
- XOVLSEGSIZ EQU PARSIZ ; this had better be true!!! (16 bytes)
- X
- Xovltbl ENDS
- X
- XEXEHDR STRUC ; structure of an EXE header
- Xexesign DW 5a4dh ; signature
- Xexelstpgesiz DW ? ; last page size (512 byte pages)
- Xexesiz DW ? ; total pages (including partial last page)
- Xrelocitems DW ? ; number of relocation entries
- Xhdrparas DW ? ; number of paragraphs in the header
- Xminalloc DW ? ; minimum paragraph allocation
- Xmaxalloc DW ? ; maximum patagraph allocation
- Xexess DW ? ; initial stack segment
- Xexesp DW ? ; initial stack pointer
- Xexechksum DW ? ; checksum
- Xexeip DW ? ; initial instruction pointer
- Xexecs DW ? ; initial code segment
- Xreloctbloff DW ? ; offset from beginning of header to relocation table
- Xexeovlnum DW ? ; overlay number
- XEXEHDR ENDS
- X
- XMASK_used EQU 1 ; memory block flag
- X
- XMEMCTLBLK STRUC ; memory block structure
- Xmemblkflg DB ? ; flags
- Xmemblkpad1 DB ? ; go ahead, delete me!
- Xmemblknxt DW ? ; ^ to next block
- Xmemblkprv DW ? ; ^ to previous block
- Xmemblkovl DW ? ; ^ to overlay occupying this block
- Xmemblksiz DW ? ; size in paragraphs
- Xmemblkpad DB PARSIZ - memblkpad MOD PARSIZ DUP (?) ; pad to 16 bytes
- XMEMCTLBLK ENDS
- X
- XMEMCTLBLKSIZ EQU TYPE MEMCTLBLK / PARSIZ ; should equal 1 paragraph
- X
- X;-------------------------------------------------------------------------------
- X
- Xcode SEGMENT PUBLIC
- X
- X; NOTE: the following order is optimum for alignement purposes accross the
- X; entire INTEL 80x86 family of processors.
- X
- Xovltim DD ? ; pseudo-lru time variable
- Xfarcall DD ? ; internal trampoline.
- Xoldvec DD -1 ; saved interrupt vector
- Xoldint21 DD -1 ; saved int 21 vector
- Xovlexefilhdl DW -1 ; always-open file handle of our .EXE
- Xovltblbse DW -1 ; segment of first overlay descriptor
- Xovlcnt DW ? ; # overlays
- Xmodcnt DW ? ; # of modules
- Xovlrootcode DW ? ; logical segment of OVERLAY_AREA
- Xovldata DW ? ; logical segment of OVERLAY_END
- Xmemblk1st DW ? ; first memory block
- Xpspadd DW ? ; our psp address + 10h (for relocations)
- Xbxreg DW ? ; temp save area
- Xesreg DW ? ; temp save area
- Xmoduletbl DD 256 DUP (?) ; module lookup table (256 modules)
- Xcurovl DW OFFSET stkframe ; ^ into stack frame
- Xstkframe DW 64*3 DUP (?) ; internal stack (64 ovls deep)
- Xhdr EXEHDR <> ; EXE header work area
- Xintnum DB ? ; overlay interrupt number
- X
- Xnoroom DB CR,LF,'Not enough memory to run this program. Time to go to the store.',CR,LF,BELL,'$'
- Xnocore DB CR,LF,'Your dog eats all your remaining memory! You die.',CR,LF,BELL,'$'
- Xnofile DB CR,LF,'The Nymph stole your .EXE file! You die.',CR,LF,BELL,'$'
- Xexitmsg DB CR,LF,'$'
- X
- X;-------------------------------------------------------------------------------
- X
- X$$OVLINIT PROC FAR ; Init entry point
- X
- X ASSUME CS:code,DS:pspseg,ES:NOTHING
- X
- X push ax
- X push bx
- X push cx
- X push dx
- X push si
- X push di
- X push bp
- X push ds
- X push es ; save the world
- X mov ax,ds ; get our psp
- X add ax,10h
- X mov pspadd,ax ; save it
- X mov ds,pspenv ; get environment segment
- X mov si,-1
- Xenvloop: ; search for end of environment
- X inc si
- X cmp WORD PTR [si],0
- X jnz envloop
- X add si,4 ; point to EXE filename
- X mov al,0 ; access code
- X mov ah,DOSOPEN
- X mov dx,si
- X int DOS ; open EXE
- X jnc dontdie
- X mov al,5
- X mov dx,OFFSET nofile
- X jmp putserr ; cry to the world!
- Xdontdie:
- X mov ovlexefilhdl,ax ; save handle
- X mov ax,SEG $$OVLBASE ; OVERLAY_AREA segment
- X mov ovlrootcode,ax
- X
- X; Now allocate memory
- X mov bx,0900h ; allocate memory for malloc()
- X mov ah,DOSALLOC
- X int DOS
- X jnc getmore
- X jmp buyram
- Xgetmore:
- X mov es,ax ; find largest free memory
- X mov ah,DOSALLOC
- X mov bx,0ffffh ; Everything
- X int DOS
- X mov ah,DOSALLOC ; allocate our own memory
- X int DOS
- X jnc gotitall
- X jmp buyram
- Xgotitall:
- X mov ovltblbse,ax ; overlay descriptor table begins at start of memory block
- X mov ax,SEG $$COVL ; segment of DGROUP
- X mov ds,ax
- X mov cx,$$CGSN ; number of modules
- X mov modcnt,cx ; save for later use
- X mov cx,$$COVL ; number of physical overlays
- X mov ovlcnt,cx ; save for later use
- X sub bx,cx ; enough mem for ovl tbl?
- X jnc memloop
- X jmp buyram
- Xmemloop:
- X push bx
- X mov ah,DOSFREE ; free first block for malloc()
- X int DOS
- X jnc cockadoodledoo
- X jmp buyram
- Xcockadoodledoo:
- X
- X ASSUME ES:ovltbl
- X
- X xor bp,bp
- X xor di,di
- X xor si,si
- Xfilsegtbllpp: ; initialise ovl table
- X call gethdr ; get an EXE header
- X mov ax,ovltblbse
- X add ax,hdr.exeovlnum
- X mov es,ax ; ^ to ovl table entry
- X xor ax,ax
- X mov WORD PTR ovllrudat,ax ; initialise ovl lru
- X mov WORD PTR ovllrudat+2,ax
- X mov ovlseg,ax ; initialise ovl segment
- X mov ovlflg,al ; initialise ovl flags
- X mov ax,hdr.exesiz
- X shl ax,1
- X shl ax,1
- X shl ax,1
- X shl ax,1
- X shl ax,1 ; * 32
- X mov dx,hdr.exelstpgesiz
- X or dx,dx
- X jz emptypage
- X shr dx,1
- X shr dx,1
- X shr dx,1
- X shr dx,1 ; / 16
- X inc dx
- X sub ax,20h
- X add ax,dx
- Xemptypage:
- X mov ovlsiz,ax ; overlay size in paragraphs
- X sub ax,hdr.hdrparas ; actual size of code and relocation table
- X cmp hdr.exeovlnum,0 ; skip if ovl 0 (root code)
- X jz notlargest
- X cmp ax,di ; find largest ovl
- X jc notlargest
- X mov di,ax
- X mov si,ovlsiz
- Xnotlargest:
- X mov ovlfiloff,bp ; initialise ovl file offset
- X add bp,hdr.exesiz ; ^ to next overlay
- X mov dx,bp
- X mov cl,dh
- X mov dh,dl
- X xor ch,ch
- X xor dl,dl
- X shl dx,1
- X rcl cx,1 ; cx:dx = bp * 512
- X mov al,0
- X mov ah,DOSSEEK ; seek to next ovl
- X int DOS
- X mov ax,ovlcnt
- X dec ax
- X cmp ax,hdr.exeovlnum ; all overlays done?
- X jz makmemblk
- X jmp filsegtbllpp ; Nope, go for more.
- Xmakmemblk:
- X push si ; contains largest ovl size in paragraphs
- X
- X ASSUME ES:nothing ; prepare first two memory blocks
- X ; OVERLAY_AREA and allocated memory block
- X mov ax,ovlrootcode ; OVERLAY_AREA segment
- X mov es,ax
- X mov si,ovltblbse
- X add si,ovlcnt ; end of ovl table
- X mov es:memblkflg,0 ; clear mem flags
- X mov es:memblknxt,si ; point to next
- X mov es:memblkprv,0 ; set previous to nothing
- X mov es:memblksiz,di ; di contains OVERLAY_AREA size in paragraphs
- X add di,ax
- X mov ovldata,di ; end of OVERLAY_END
- X mov es,si ; end of ovl tbl (first memory block in allocated memory)
- X mov es:memblkflg,0 ; clear mem flags
- X mov es:memblknxt,0 ; set next to nothing
- X mov es:memblkprv,ax ; point to previous
- X pop si
- X pop bx
- X mov es:memblksiz,bx ; allocated memory block size less ovl table
- X mov memblk1st,ax ; save pointer to first mem block
- X mov WORD PTR ovltim,0 ; initialise global lru time stamp
- X mov WORD PTR ovltim+2,0
- X mov ax,OFFSET stkframe
- X mov curovl,ax ; initialise stack frame pointer
- X mov di,ax
- X mov WORD PTR cs:[di],-1 ; initialise stack frame
- X add di,6
- X mov ax,ovltblbse
- X mov cs:[di],ax
- X mov curovl,di
- X mov es,ax
- X mov es:ovlflg,MASK running OR MASK locked OR MASK loaded ; set flags on ovl 0
- X inc si ; largest ovl size + 1 paragraph
- X cmp bx,si ; enough memory to alloc largest?
- X jnc chgintvec
- Xbuyram:
- X mov al,5
- X mov dx,OFFSET noroom ; free up some TSRs or something
- X jmp putserr
- Xchgintvec:
- X mov ax,SEG $$INTNO
- X mov ds,ax
- X mov ah,DOSGETVEC
- X mov al,$$INTNO ; get int number to use
- X mov intnum,al
- X int DOS ; get original vector
- X mov WORD PTR oldvec,bx ; save original vector
- X mov WORD PTR oldvec+2,es
- X
- X mov ah,DOSGETVEC
- X mov al,21h
- X int DOS ; get original vector
- X mov WORD PTR oldint21,bx ; save original vector
- X mov WORD PTR oldint21+2,es
- X
- X mov ah,DOSSETVEC
- X mov al,intnum
- X mov bx,cs
- X mov ds,bx
- X mov dx,OFFSET ovlmgr ; point to ovlmgr
- X int DOS ; set vector
- X
- X mov ah,DOSSETVEC
- X mov al,21h
- X mov bx,cs
- X mov ds,bx
- X mov dx,OFFSET int21 ; point to int21
- X int DOS ; set vector
- X
- X mov cx,modcnt ; module count
- X mov ax,SEG $$MPGSNBASE
- X mov es,ax
- X mov ax,cs
- X mov ds,ax
- X
- X ASSUME DS:code
- X
- X mov bx,OFFSET $$MPGSNBASE ; ^ to linker provided overlay segment fixups
- X mov si,OFFSET $$MPGSNOVL ; ^ to linker provided module table
- X mov di,OFFSET moduletbl ; ^ to our module table
- Xmodloop:
- X mov al,es:[si] ; real physical ovl number
- X xor ah,ah
- X add ax,ovltblbse ; ovlctlseg address
- X mov [di],ax ; save in module table
- X mov ax,es:[bx] ; get seg fixup
- X sub ax,ovlrootcode ; adjust for relative reference
- X mov [di+2],ax ; save in module table
- X add di,4
- X add bx,2
- X inc si
- X loop modloop
- X
- X pop es
- X pop ds
- X pop bp
- X pop di
- X pop si
- X pop dx
- X pop cx
- X pop bx
- X pop ax ; restore the world
- X jmp $$MAIN ; And away we go!
- X
- X$$OVLINIT ENDP
- X
- X;-------------------------------------------------------------------------------
- X
- Xovlmgr PROC FAR ; This the it!
- X
- X ASSUME CS:code,DS:NOTHING,ES:NOTHING
- X
- X mov bxreg,bx ; preserve bx
- X mov esreg,es ; and es
- X pop bx ; retrieve caller ip
- X pop es ; " " cs
- X push ax
- X push si
- X mov ax,es:[bx+1] ; offset in ovl to call
- X mov WORD PTR farcall,ax ; into trampoline
- X xor ah,ah
- X mov al,es:[bx] ; module # to call
- X add bx,3 ; fix return address
- X mov si,curovl ; get stack frame pointer
- X mov cs:[si+2],es ; save return seg
- X mov cs:[si+4],bx ; and return offset
- X
- X mov bx,ax
- X shl bx,1
- X shl bx,1 ; * 4 (2 words/entry in module tbl)
- X add bx,OFFSET moduletbl
- X mov es,cs:[bx] ; ovl tbl entry
- X mov ax,cs:[bx+2] ; segment fixup
- X mov cs:[si+6],es ; ovl entry into stack frame
- X add curovl,6 ; update stack
- X
- X ASSUME ES:ovltbl
- X
- X mov si,WORD PTR ovltim ; lru time stamp
- X inc si ; time passes!
- X mov WORD PTR ovltim,si ; update global clock
- X mov WORD PTR ovllrudat,si ; as well as ovl clock
- X mov si,WORD PTR ovltim+2 ; high order word
- X jz ininc ; dword increment
- Xcryupcdon: mov WORD PTR ovllrudat+2,si
- X test ovlflg,mask loaded ; ovl loaded?
- X jz inload ; load it then.
- Xovlloadedupc:
- X add ax,ovlseg ; add fixup and segment address
- X mov WORD PTR farcall+2,ax ; into trampoline
- X mov bx,bxreg ; retore all registers
- X mov es,esreg
- X pop si
- X pop ax
- X popf ; don't forget these!
- X call DWORD PTR farcall ; and GO
- X pushf ; preserve registers again!
- X mov esreg,es
- X mov bxreg,bx
- X mov bx,curovl ; stack frame pointer
- X mov es,cs:[bx-6] ; retrieve ovl tbl entry
- X push cs:[bx-4] ; set return address
- X push cs:[bx-2]
- X push cx
- X mov cx,WORD PTR ovltim ; do the lru thing again
- X inc cx
- X mov WORD PTR ovltim,cx
- X mov WORD PTR ovllrudat,cx
- X mov cx,WORD PTR ovltim+2
- X jz outinc
- Xcrydncdon: mov WORD PTR ovllrudat+2,cx
- X test ovlflg,mask loaded ; ovl loaded?
- X jz outload ; better get it before someone notices
- Xjmpback:
- X sub curovl,6 ; adjust stack
- X mov bx,bxreg ; get registers back
- X mov es,esreg
- X pop cx
- X iret ; and GO back
- X
- Xininc:
- X inc si
- X mov WORD PTR ovltim+2,si ; update global clock
- X jmp cryupcdon
- X
- Xinload:
- X call loadoverlay ; self explanatory
- X jmp ovlloadedupc
- X
- Xoutinc:
- X inc cx
- X mov WORD PTR ovltim+2,cx
- X jmp crydncdon
- X
- Xoutload:
- X call loadoverlay
- X jmp jmpback
- X
- Xovlmgr ENDP
- X
- X;-------------------------------------------------------------------------------
- X
- Xloadoverlay PROC NEAR ; load overlay pointed to by es
- X
- X ASSUME CS:code,DS:NOTHING,ES:ovltbl
- X
- X push ax
- X push bx
- X push cx
- X push dx
- X push si
- X push di
- X push bp
- X push ds
- X push es ; just in case
- X call setrunning ; set the running flags
- X test ovlflg,MASK running ; was it already running?
- X jnz fxdadr ; Yup, it's a toughie
- X mov ax,ovlsiz ; How much?
- X call getpages ; never fail mem alloc, you bet.
- X jmp gleaner
- Xfxdadr:
- X call releasepages ; free memory where this ovl should be loaded
- Xgleaner:
- X mov ovlmemblk,ax ; memory block to use
- X add ax,MEMCTLBLKSIZ ; skip mem ctl blk
- X mov ds,ax
- X mov dx,ovlfiloff ; where in the file is it?
- X mov cl,dh
- X mov dh,dl
- X xor ch,ch
- X xor dl,dl
- X shl dx,1
- X rcl cx,1 ; cx:dx = dx * 512
- X mov ah,DOSSEEK ; lseek to position
- X mov al,0
- X mov bx,ovlexefilhdl ; never closing handle
- X int DOS
- X jc burnhead ; oops!
- X xor dx,dx
- X mov cx,ovlsiz ; number of paragraphs to load
- X shl cx,1
- X shl cx,1
- X shl cx,1
- X shl cx,1 ; * 16 = number of bytes
- X mov ah,DOSREAD ; prevent random DOS behaviour
- X int DOS
- X jc burnhead ; double oops!
- X call ovlrlc ; perform relocation normally done by DOS EXE loader
- X pop es ; retrieve ovl tbl entry
- X or ovlflg,MASK loaded ; because it is now
- X pop ds
- X pop bp
- X pop di
- X pop si
- X pop dx
- X pop cx
- X pop bx
- X pop ax
- X ret
- X
- Xburnhead:
- X mov al,5
- X mov dx,OFFSET nofile
- X jmp putserr
- X
- Xloadoverlay ENDP
- X
- X;-------------------------------------------------------------------------------
- X
- Xovlrlc PROC NEAR ; ds:0 -> the overlay to relocate
- X
- X ASSUME CS:code,DS:NOTHING,ES:ovltbl
- X
- X mov cx,ds:relocitems ; roto-count
- X mov ax,ds
- X add ax,ds:hdrparas ; skip header
- X mov ovlseg,ax ; actual code starts here
- X mov di,ax
- X sub di,ovlrootcode ; segment fixup value
- X mov si,ds:reloctbloff ; ^ relocation tbl in header
- X jcxz relocdone ; not such a good idea, after all
- Xdorelocs: ; labels don't GET comments
- X lodsw ; offset into load module
- X mov bx,ax
- X lodsw ; segment in load module (zero reference)
- X add ax,pspadd ; now it is psp relative
- X add ax,di ; and now it is relative to the actual load address
- X mov es,ax
- X mov ax,es:[bx] ; pickup item to relocate
- X add ax,pspadd ; make it psp relative
- X cmp ax,ovlrootcode ; is it below the OVERLAY_AREA?
- X jc reloccomputed ; yup. it's relocated
- X cmp ax,ovldata ; is it above OVERLAY_AREA
- X jnc reloccomputed ; yup. it's relocated
- X add ax,di ; it's in OVERLAY_AREA, this one's ours.
- Xreloccomputed:
- X mov es:[bx],ax ; RAM it home!?!
- X loop dorelocs ; what goes around, comes around.
- Xrelocdone: ret
- X
- Xovlrlc ENDP
- X
- X;-------------------------------------------------------------------------------
- X
- Xgetvictim PROC NEAR ; select a victim to discard (and free up some memory)
- X
- X ASSUME CS:code,DS:ovltbl,ES:NOTHING
- X
- X push bx
- X push cx
- X push dx
- X push si
- X push di
- X push bp
- X push ds
- X mov ds,ovltblbse ; ^ ovl tbl
- X xor ax,ax ; will contain the low word of lru
- X mov dx,ax ; will contain the high word of lru
- X mov bp,ax ; will contain ovl tbl entry
- X mov bx,ax ; ovl tbl ptr
- X mov cx,ovlcnt
- Xfoon1: test ovlflg[bx],MASK loaded
- X jz skip1
- X test ovlflg[bx],MASK locked
- X jnz skip1
- X mov si,WORD PTR ovltim
- X mov di,WORD PTR ovltim+2
- X sub si,WORD PTR ovllrudat[bx]
- X sbb di,WORD PTR ovllrudat[bx+2]
- X cmp dx,di
- X jc better1
- X jnz skip1
- X cmp ax,si
- X jnc skip1
- Xbetter1: mov ax,si
- X mov dx,di
- X mov bp,bx
- Xskip1: add bx,OVLSEGSIZ
- X loop foon1
- X or bp,bp ; were we more successful this time?
- X jnz gotvictim ; now we got one.
- Xnomoremem:
- X mov al,5 ; were really %$# now!
- X mov dx,OFFSET nocore
- X jmp putserr
- Xgotvictim:
- X shr bp,1 ; convert offset to segment
- X shr bp,1
- X shr bp,1
- X shr bp,1
- X mov ax,ds
- X add ax,bp
- X pop ds
- X pop bp
- X pop di
- X pop si
- X pop dx
- X pop cx
- X pop bx
- X ret
- Xgetvictim ENDP
- X
- X;-------------------------------------------------------------------------------
- X
- Xsetrunning PROC NEAR ; set running flag on overlays still running
- X
- X ASSUME CS:code,DS:NOTHING,ES:ovltbl
- X
- X push es
- X mov es,ovltblbse
- X mov cx,ovlcnt
- X xor bx,bx
- Xjim: and ovlflg[bx],NOT MASK running ; start by clearing them all
- X add bx,OVLSEGSIZ
- X loop jim
- X
- X ; Now chain down the stack links, setting running flags
- X
- X mov bx,curovl
- X sub bx,6
- X jmp jam
- Xjamloop:
- X mov ds,cs:[bx]
- X
- X ASSUME DS:ovltbl
- X
- X or ovlflg,MASK running
- X sub bx,6
- Xjam:
- X cmp WORD PTR cs:[bx],-1 ; end of stack ?
- X jnz jamloop
- X pop es
- X ret
- X
- Xsetrunning ENDP
- X
- X;-------------------------------------------------------------------------------
- X
- Xint21 PROC FAR
- X
- X; free almost all overlay memory if app. tries to call the DOS exec function.
- X
- X cmp ah,DOSEXEC
- X jz freeall
- X cmp ah,TERMINATE
- X jz saybyebye
- Xnotours:
- X jmp cs:oldint21
- Xsaybyebye:
- X pop ax ; clean up stack
- X pop ax
- X pop ax
- X mov al,0 ; return code 0
- X mov dx,OFFSET exitmsg
- X jmp putserr
- Xfreeall:
- X or al,al ; is it load and exec?
- X jnz notours
- X push ax
- X push bx
- X push cx
- X push dx
- X push si
- X push di
- X push bp
- X push es
- X push ds ; preserve calling env.
- X
- X ASSUME CS:code,DS:NOTHING,ES:ovltbl
- X
- X mov ax,cs:memblk1st ; start de-allocating from first blk
- X jmp short lastblk
- Xunloadlp:
- X mov ds,ax
- X cmp ax,cs:ovltblbse ; in alloced area ?
- X jc nextmemblk
- X test ds:memblkflg,MASK_used ; mem blk used ?
- X jz nextmemblk
- X mov es,ds:memblkovl
- X and ovlflg,NOT MASK loaded ; flag overlay as unloaded
- Xnextmemblk:
- X mov ax,ds:memblknxt
- Xlastblk:
- X or ax,ax ; keep going till no more
- X jnz unloadlp
- X
- X mov ax,cs:ovltblbse
- X add ax,cs:ovlcnt
- X mov es,ax ; ^ to first mem blk in alloced mem
- X mov es:memblksiz,2 ; adjust size
- X mov es:memblknxt,0 ; no other blocks after this one
- X mov es:memblkflg,0 ; not used
- X
- X mov dx,WORD PTR cs:oldint21
- X mov ds,WORD PTR cs:oldint21+2
- X mov ah,DOSSETVEC ; put back DOS vector to avoid calling ourselves again!
- X mov al,21h
- X int DOS
- X
- X mov dx,WORD PTR cs:oldvec
- X mov ds,WORD PTR cs:oldvec+2
- X mov ah,DOSSETVEC
- X mov al,intnum
- X int DOS
- X
- X mov es,cs:ovltblbse
- X mov bx,cs:ovlcnt
- X add bx,2 ; re-adjust alloced size
- X mov ah,DOSREALLOC
- X int DOS
- X mov bp,sp
- X push [bp+22] ; ensure returned flags are based on user's!
- X popf
- X pop ds
- X pop es
- X pop bp
- X pop di
- X pop si
- X pop dx
- X pop cx
- X pop bx
- X pop ax
- X
- X int DOS ; allow DOS to continue!
- X
- X push ax
- X push bx
- X push cx
- X push dx
- X push si
- X push di
- X push bp
- X push es
- X push ds ; preserve calling env.
- X mov bp,sp
- X pushf
- X pop [bp+22] ; fix return flags
- X
- X; re-allocate our memory after a DOS exec function
- X
- X call reallocmem
- X
- X mov ah,DOSGETVEC
- X mov al,21h
- X int DOS ; get original vector
- X mov WORD PTR cs:oldint21,bx ; save original vector
- X mov WORD PTR cs:oldint21+2,es
- X
- X mov ah,DOSSETVEC
- X mov al,21h
- X mov bx,cs
- X mov ds,bx
- X mov dx,OFFSET int21 ; point to int21
- X int DOS ; set vector
- X
- X mov ah,DOSGETVEC
- X mov al,intnum
- X int DOS ; get original vector
- X mov WORD PTR cs:oldvec,bx ; save original vector
- X mov WORD PTR cs:oldvec+2,es
- X
- X mov ah,DOSSETVEC
- X mov al,intnum
- X mov bx,cs
- X mov ds,bx
- X mov dx,OFFSET ovlmgr ; point to ovlmgr
- X int DOS ; set vector
- X
- X pop ds
- X pop es
- X pop bp
- X pop di
- X pop si
- X pop dx
- X pop cx
- X pop bx
- X pop ax
- X iret
- X
- Xint21 ENDP
- X
- X;-------------------------------------------------------------------------------
- X
- Xreallocmem PROC NEAR
- X
- X; re-allocate our memory after a DOS exec function
- X
- X push es
- X mov ah,DOSREALLOC
- X mov es,cs:ovltblbse ; mem blk handle
- X mov bx,0ffffh ; find out how much there is
- X int DOS
- X mov ah,DOSREALLOC ; re-allocate our own memory
- X mov es,cs:ovltblbse
- X push bx ; contains largest available blk
- X int DOS
- X mov ax,cs:ovltblbse
- X add ax,cs:ovlcnt
- X mov es,ax ; ^ to first mem blk in alloced mem
- X pop ax
- X sub ax,cs:ovlcnt ; remove ovl tbl size
- X mov es:memblksiz,ax ; fix mem blk size
- X
- X pop es
- X ret
- X
- Xreallocmem ENDP
- X
- X;-------------------------------------------------------------------------------
- X
- Xreleasepages PROC NEAR ; Arg in es, result in ax
- X
- X; release any memory (and overlays) where this overlay should reside
- X
- X ASSUME ES:ovltbl
- X
- X mov bx,es:ovlmemblk ; start of memory to release
- Xdoitagain:
- X mov ax,memblk1st ; first memory blk
- X jmp dvart
- Xdvartloop:
- X mov ds,ax ; memory blk to check
- X cmp bx,ax ; does it start below the memory to release?
- X jnc dvartsmaller ; yup
- X mov dx,bx
- X add dx,es:ovlsiz
- X add dx,MEMCTLBLKSIZ ; end of memory to release
- X cmp ax,dx ; does it start above?
- X jnc dvartsilly ; yup
- X call killmem ; it's in the way. Zap it.
- X jmp chkmemblk
- Xdvartsmaller:
- X add ax,ds:memblksiz ; end of this memory blk
- X cmp bx,ax ; does it end below the memory to release?
- X jnc dvartsilly ; yup
- X call killmem ; Oh well, zap it too.
- Xchkmemblk: ; was that enough?
- X mov ax,ds ; recently freed memory blk
- X cmp bx,ax ; does it start in the memory to be released?
- X jc dvartsilly ; yup, wasn't enough
- X mov dx,bx
- X add dx,es:ovlsiz
- X add dx,MEMCTLBLKSIZ ; end of memory to be released
- X add ax,ds:memblksiz ; end of freed memory
- X cmp ax,dx ; does it end in the memory to be released?
- X jc dvartsilly ; yup, release more
- Xdvartgotblk:
- X mov ax,ds ; this is it!
- X mov cx,bx
- X sub cx,ax ; # of paragraphs between start of memory to release and mem blk
- X jz nosplit
- X call splitblkhigh ; split the block
- Xnosplit:
- X mov cx,es:ovlsiz
- X add cx,MEMCTLBLKSIZ ; paragraphs needed to load ovl
- X jmp splitblklow ; split remaining block
- Xdvartsilly:
- X mov ax,ds:memblknxt
- Xdvart:
- X or ax,ax ; enf of mem list?
- X jz dvartnocore
- X jmp dvartloop ; play it again Sam.
- Xdvartnocore:
- X mov al,5 ; super OOPS!
- X mov dx,OFFSET nocore
- X jmp putserr
- X
- Xreleasepages ENDP
- X
- X;-------------------------------------------------------------------------------
- X
- Xgetpages PROC NEAR ; get enough memory to load ovl
- X
- X mov cx,ax
- X add cx,MEMCTLBLKSIZ ; total paragraphs needed
- X call largestmem ; find largest free blk
- X cmp dx,cx ; large enough?
- X jnc gotdork ; yup.
- Xdorkkill:
- X call getvictim ; select a victim to release
- X call killovl ; kill the selected victim
- X cmp ds:memblksiz,cx ; was it enough?
- X jc dorkkill ; nope, select another one
- Xgotdork:
- X jmp splitblklow ; split the free blk
- X
- Xgetpages ENDP
- X
- X;-------------------------------------------------------------------------------
- X
- Xsplitblklow PROC NEAR
- X
- X; split a block of memory returning the lower one to be used.
- X
- X push es
- X or ds:memblkflg,MASK_used ; set low block used
- X mov ax,ds
- X add ax,cx
- X mov es,ax ; ^ to upper blk to be created
- X mov ax,ds:memblksiz
- X sub ax,cx
- X cmp ax,1 ; must be at least 1 para remaining to split
- X jc noodorksplit ; don't split
- X mov ds:memblksiz,cx ; fix blk sizes
- X mov es:memblksiz,ax
- X mov ax,ds:memblknxt ; fix pointers
- X mov es:memblknxt,ax
- X mov ds:memblknxt,es
- X mov es:memblkprv,ds
- X mov es:memblkflg,0 ; set upper to not used
- X push ds
- X mov ax,es:memblknxt
- X or ax,ax
- X jz domergelow
- X mov ds,ax ; fix blk after upper to point to upper
- X mov ds:memblkprv,es
- Xdomergelow:
- X mov ax,es
- X mov ds,ax
- X call mergemem ; merge remaining free memory
- X pop ds
- Xnoodorksplit:
- X pop es
- X mov ds:memblkovl,es ; fix ptr to ovl
- X mov ax,ds ; return lower blk segment
- X ret
- X
- Xsplitblklow ENDP
- X
- X;-------------------------------------------------------------------------------
- X
- Xsplitblkhigh PROC NEAR
- X
- X; split a block of memory returning the upper one to be used.
- X
- X push es
- X mov ax,ds
- X add ax,cx
- X mov es,ax ; ^ to upper blk to be created
- X mov ax,ds:memblksiz
- X sub ax,cx ; # of para remaining in upper blk
- X mov ds:memblksiz,cx ; fix blk sizes
- X mov es:memblksiz,ax
- X mov ax,ds:memblknxt ; fix blk pointers
- X mov es:memblknxt,ax
- X mov ds:memblknxt,es
- X mov es:memblkprv,ds
- X mov ds:memblkflg,0 ; set lower to not used
- X or es:memblkflg,MASK_used ; set upper to used
- X mov ax,es:memblknxt
- X or ax,ax
- X jz domergehigh
- X push ds ; fix blk after upper to point to upper
- X mov ds,ax
- X mov ds:memblkprv,es
- X pop ds
- Xdomergehigh:
- X call mergemem ; merge remaining free memory
- Xnodorksplit:
- X mov ax,es
- X mov ds,ax
- X pop es
- X mov ds:memblkovl,es ; fix ovl ptr
- X mov ax,ds ; return upper blk segment
- X ret
- X
- Xsplitblkhigh ENDP
- X
- X;-------------------------------------------------------------------------------
- X
- Xlargestmem PROC NEAR ; returns seg in ax, size in dx; clobbers bx,ds,es
- X ; retruns first block that's large enough if possible
- X
- X mov ax,memblk1st ; first mem blk
- X xor dx,dx ; largest size found
- X jmp gook
- Xgookloop: mov ds,ax
- X test ds:memblkflg,MASK_used ; is this blk used?
- X jnz gookme ; yup
- X cmp ds:memblksiz,cx ; is it large enough?
- X jc gookme ; nope
- X mov dx,ds:memblksiz ; got one!
- X ret
- Xgookme:
- X mov ax,ds:memblknxt
- Xgook: or ax,ax ; end of list?
- X jnz gookloop ; around and around
- X ret
- X
- Xlargestmem ENDP
- X
- X;-------------------------------------------------------------------------------
- X
- Xkillmem PROC NEAR
- X
- X test ds:memblkflg,MASK_used ; is it used?
- X jz memnotused ; don't kill ovl
- X push es
- X mov es,ds:memblkovl
- X and es:ovlflg,NOT MASK loaded ; zap ovl associated with this blk
- X pop es
- Xmemnotused:
- X jmp mergemem ; merge free memory
- X
- Xkillmem ENDP
- X
- X;-------------------------------------------------------------------------------
- X
- Xkillovl PROC NEAR ; preserves bx
- X
- X mov ds,ax
- X
- X ASSUME DS:ovltbl
- X
- X and ovlflg,NOT MASK loaded ; ovl no longer loaded
- X mov ax,ovlmemblk ; get mem blk
- X mov ds,ax
- X jmp mergemem ; merge free memory
- X
- Xkillovl ENDP
- X
- X;-------------------------------------------------------------------------------
- X
- Xmergemem PROC NEAR
- X
- X; merge physically adjacent free memory blocks. Preserves es. ds -> a free block.
- X
- X push es
- X and ds:memblkflg,NOT MASK_used ; set current free
- X mov ax,ds:memblkprv ; get previous blk
- X or ax,ax ; was there a previous blk?
- X jz gibber ; nope
- X mov es,ax
- X test es:memblkflg,MASK_used ; is the previous blk used?
- X jnz gibber ; yup
- X add ax,es:memblksiz ; end of previous blk
- X mov dx,ds
- X cmp dx,ax ; physically adjacent?
- X jnz gibber ; nope
- X mov ax,ds:memblksiz
- X add es:memblksiz,ax ; adjust size of new larger blk
- X mov ax,ds:memblknxt ; fix pointers
- X mov es:memblknxt,ax
- X or ax,ax
- X jz almostgibber
- X mov ds,ax ; fix pointer of next blk
- X mov ds:memblkprv,es
- Xalmostgibber:
- X mov ax,es
- X mov ds,ax ; new blk segment
- Xgibber:
- X mov ax,ds:memblknxt ; get next blk
- X or ax,ax ; was there a next blk?
- X jz killdone ; nope
- X mov es,ax
- X test es:memblkflg,MASK_used ; is the nxt blk used?
- X jnz killdone ; yup
- X mov ax,ds
- X add ax,ds:memblksiz ; end of this blk
- X mov dx,es
- X cmp ax,dx ; physically adjacent?
- X jnz killdone ; nope
- X mov ax,es:memblksiz
- X add ds:memblksiz,ax ; adjust size of new larger blk
- X mov ax,es:memblknxt ; fix pointers
- X mov ds:memblknxt,ax
- X or ax,ax
- X jz killdone
- X mov es,ax ; fix pointer of blk after nxt
- X mov es:memblkprv,ds
- Xkilldone:
- X and ds:memblkflg,NOT MASK_used ; make sure it's free
- X pop es
- X ret
- X
- Xmergemem ENDP
- X
- X;-------------------------------------------------------------------------------
- X
- Xgethdr PROC NEAR ; read EXE header from handle
- X
- X push cx
- X mov ax,cs
- X mov ds,ax
- X mov dx,OFFSET hdr ; a place to put it
- X mov bx,ovlexefilhdl ; the file handle
- X mov cx,TYPE EXEHDR ; header size in bytes
- X mov ah,DOSREAD
- X int DOS ; read from file
- X jc exegone ; oops
- X cmp ax,cx ; got correct number of bytes?
- X jnz exegone ; nope
- X pop cx
- X ret ; Wow, it worked!
- Xexegone:
- X mov al,5 ; You lose!
- X mov dx,OFFSET nofile
- X jmp putserr
- X
- Xgethdr ENDP
- X
- X;-------------------------------------------------------------------------------
- X
- Xputserr PROC NEAR
- X
- X; display error msg, close file, restore int vectors, free mem and return to DOS.
- X
- X push ax ; keep return code for later
- X mov ax,cs
- X mov ds,ax
- X mov ah,PRINT
- X int DOS ; display error msg
- X mov dx,WORD PTR oldvec ; get old vector
- X cmp dx,-1 ; was it ever replaced?
- X jz free21 ; nope
- X push ds
- X mov ds,WORD PTR oldvec+2
- X mov ah,DOSSETVEC ; put it back then.
- X mov al,intnum
- X int DOS
- X pop ds
- Xfree21:
- X mov dx,WORD PTR oldint21
- X cmp dx,-1
- X jz freemem
- X push ds
- X mov ds,WORD PTR oldint21+2
- X mov ah,DOSSETVEC ; put it back then.
- X mov al,21h
- X int DOS
- X pop ds
- Xfreemem:
- X mov ax,ovltblbse ; get memory blk segment
- X cmp ax,-1 ; was one ever allocated?
- X jz closefile ; nope
- X mov es,ax
- X mov ah,DOSFREE ; must free it.
- X int DOS
- Xclosefile:
- X mov bx,ovlexefilhdl ; get file handle
- X cmp bx,-1 ; was the file ever opened?
- X jz byebye ; nope
- X mov ah,DOSCLOSE ; close it
- X int DOS
- Xbyebye:
- X pop ax ; return code in al
- X mov ah,TERMINATE
- X int DOS ; terminate this process
- X
- Xputserr ENDP
- X
- Xcode ENDS
- X
- X END
- END_OF_FILE
- if test 30539 -ne `wc -c <'others/ovlmgr.asm'`; then
- echo shar: \"'others/ovlmgr.asm'\" unpacked with wrong size!
- fi
- # end of 'others/ovlmgr.asm'
- if test -f 'src/lev_lex.c' -a "${1}" != "-c" ; then
- echo shar: Renaming existing file \"'src/lev_lex.c'\" to \"'src/lev_lex.c.orig'\"
- mv -f 'src/lev_lex.c' 'src/lev_lex.c.orig'
- fi
- echo shar: Extracting \"'src/lev_lex.c'\" \(21018 characters\)
- sed "s/^X//" >'src/lev_lex.c' <<'END_OF_FILE'
- X# include "stdio.h"
- X# define U(x) x
- X# define NLSTATE yyprevious=YYNEWLINE
- X# define BEGIN yybgin = yysvec + 1 +
- X# define INITIAL 0
- X# define YYLERR yysvec
- X# define YYSTATE (yyestate-yysvec-1)
- X# define YYOPTIM 1
- X# define YYLMAX 200
- X# define output(c) putc(c,yyout)
- X# define input() (((yytchar=yysptr>yysbuf?U(*--yysptr):getc(yyin))==10?(yylineno++,yytchar):yytchar)==EOF?0:yytchar)
- X# define unput(c) {yytchar= (c);if(yytchar=='\n')yylineno--;*yysptr++=yytchar;}
- X# define yymore() (yymorfg=1)
- X# define ECHO fprintf(yyout, "%s",yytext)
- X# define REJECT { nstr = yyreject(); goto yyfussy;}
- Xint yyleng; extern char yytext[];
- Xint yymorfg;
- Xextern char *yysptr, yysbuf[];
- Xint yytchar;
- XFILE *yyin ={stdin}, *yyout ={stdout};
- Xextern int yylineno;
- Xstruct yysvf {
- X struct yywork *yystoff;
- X struct yysvf *yyother;
- X int *yystops;};
- Xstruct yysvf *yyestate;
- Xextern struct yysvf yysvec[], *yybgin;
- X/* SCCS Id: @(#)lev_lex.c 3.0 90/01/04
- X/* Copyright (c) 1989 by Jean-Christophe Collet */
- X/* NetHack may be freely redistributed. See license for details. */
- X
- X#define LEV_LEX_C
- X
- X/* block some unused #defines to avoid overloading some cpp's */
- X#define MONDATA_H /* comment this line for pre-compiled headers */
- X#define MONFLAG_H /* comment this line for pre-compiled headers */
- X
- X#include "hack.h"
- X#include "lev_comp.h"
- X#include "sp_lev.h"
- X
- X/* Most of these don't exist in flex, yywrap is macro and
- X * yyunput is properly declared in flex.skel.
- X */
- X#ifndef FLEX_SCANNER
- Xint FDECL (yyback, (int *, int));
- Xint NDECL (yylook);
- Xint NDECL (yyinput);
- Xint NDECL (yywrap);
- Xint NDECL (yylex);
- Xint FDECL (yyunput, (int));
- Xint FDECL (yyoutput, (int));
- X#endif
- X
- X#ifdef MSDOS
- X#undef exit
- X#endif
- X
- X/* this doesn't always get put in lev_comp.h
- X * (esp. when using older versions of bison)
- X */
- X
- Xextern YYSTYPE yylval;
- X
- X#ifdef MACOS
- X#undef putchar
- X#undef putc
- X#undef printf
- X#undef Printf
- X#define Printf printf
- X# ifdef LSC
- X#define putc(c,stream) (fputc(c,stream))
- X#define putchar(c) (fputc(c,stdout))
- X# endif
- X#endif
- Xint line_number = 1;
- X
- X/* This is *** UGLY *** but I can't think a better way to do it
- X * I really need a huge buffer to scan maps...
- X */
- X
- X#undef YYLMAX
- X#define YYLMAX 2048
- X
- X# define MAPC 2
- X# define YYNEWLINE 10
- Xyylex(){
- Xint nstr; extern int yyprevious;
- Xwhile((nstr = yylook()) >= 0)
- Xyyfussy: switch(nstr){
- Xcase 0:
- Xif(yywrap()) return(0); break;
- Xcase 1:
- X{ line_number++; yymore(); }
- Xbreak;
- Xcase 2:
- X{ BEGIN 0;
- X line_number++;
- X yytext[yyleng-7] = 0; /* Discard \nENDMAP */
- X yylval.map = (char *) alloc(strlen(yytext)+1);
- X strcpy(yylval.map, yytext);
- X return MAP_ID;
- X }
- Xbreak;
- Xcase 3:
- X { line_number++; }
- Xbreak;
- Xcase 4:
- X return MAZE_ID;
- Xbreak;
- Xcase 5:
- X return LEVEL_ID;
- Xbreak;
- Xcase 6:
- Xreturn GEOMETRY_ID;
- Xbreak;
- Xcase 7:
- X { BEGIN MAPC; line_number++; }
- Xbreak;
- Xcase 8:
- X return OBJECT_ID;
- Xbreak;
- Xcase 9:
- X return MONSTER_ID;
- Xbreak;
- Xcase 10:
- X return TRAP_ID;
- Xbreak;
- Xcase 11:
- X return DOOR_ID;
- Xbreak;
- Xcase 12:
- Xreturn DRAWBRIDGE_ID;
- Xbreak;
- Xcase 13:
- Xreturn MAZEWALK_ID;
- Xbreak;
- Xcase 14:
- X return REGION_ID;
- Xbreak;
- Xcase 15:
- Xreturn RANDOM_OBJECTS_ID;
- Xbreak;
- Xcase 16:
- Xreturn RANDOM_MONSTERS_ID;
- Xbreak;
- Xcase 17:
- Xreturn RANDOM_PLACES_ID;
- Xbreak;
- Xcase 18:
- X return ALTAR_ID;
- Xbreak;
- Xcase 19:
- X return LADDER_ID;
- Xbreak;
- Xcase 20:
- Xreturn NON_DIGGABLE_ID;
- Xbreak;
- Xcase 21:
- X return ROOM_ID;
- Xbreak;
- Xcase 22:
- X { yylval.i=D_ISOPEN; return DOOR_STATE; }
- Xbreak;
- Xcase 23:
- X { yylval.i=D_CLOSED; return DOOR_STATE; }
- Xbreak;
- Xcase 24:
- X { yylval.i=D_LOCKED; return DOOR_STATE; }
- Xbreak;
- Xcase 25:
- X { yylval.i=D_NODOOR; return DOOR_STATE; }
- Xbreak;
- Xcase 26:
- X { yylval.i=D_BROKEN; return DOOR_STATE; }
- Xbreak;
- Xcase 27:
- X { yylval.i=W_NORTH; return DIRECTION; }
- Xbreak;
- Xcase 28:
- X { yylval.i=W_EAST; return DIRECTION; }
- Xbreak;
- Xcase 29:
- X { yylval.i=W_SOUTH; return DIRECTION; }
- Xbreak;
- Xcase 30:
- X { yylval.i=W_WEST; return DIRECTION; }
- Xbreak;
- Xcase 31:
- X { yylval.i = -1; return RANDOM_TYPE; }
- Xbreak;
- Xcase 32:
- X return O_REGISTER;
- Xbreak;
- Xcase 33:
- X return M_REGISTER;
- Xbreak;
- Xcase 34:
- X return P_REGISTER;
- Xbreak;
- Xcase 35:
- X return A_REGISTER;
- Xbreak;
- Xcase 36:
- X { yylval.i=1; return LEFT_OR_RIGHT; }
- Xbreak;
- Xcase 37:
- X { yylval.i=3; return LEFT_OR_RIGHT; }
- Xbreak;
- Xcase 38:
- X { yylval.i=2; return CENTER; }
- Xbreak;
- Xcase 39:
- X { yylval.i=1; return TOP_OR_BOT; }
- Xbreak;
- Xcase 40:
- X { yylval.i=3; return TOP_OR_BOT; }
- Xbreak;
- Xcase 41:
- X { yylval.i=1; return LIGHT_STATE; }
- Xbreak;
- Xcase 42:
- X { yylval.i=0; return LIGHT_STATE; }
- Xbreak;
- Xcase 43:
- X { yylval.i=A_LAW; return ALIGNMENT; }
- Xbreak;
- Xcase 44:
- X { yylval.i=A_NEUTRAL; return ALIGNMENT; }
- Xbreak;
- Xcase 45:
- X { yylval.i=A_CHAOS; return ALIGNMENT; }
- Xbreak;
- Xcase 46:
- X { yylval.i=1; return ALTAR_TYPE; }
- Xbreak;
- Xcase 47:
- X { yylval.i=0; return ALTAR_TYPE; }
- Xbreak;
- Xcase 48:
- X { yylval.i=1; return UP_OR_DOWN; }
- Xbreak;
- Xcase 49:
- X { yylval.i=0; return UP_OR_DOWN; }
- Xbreak;
- Xcase 50:
- X { yylval.i=atoi(yytext); return INTEGER; }
- Xbreak;
- Xcase 51:
- X{ yytext[yyleng-1] = 0; /* Discard the trailing \" */
- X yylval.map = (char *) alloc(strlen(yytext+1)+1);
- X strcpy(yylval.map, yytext+1); /* Discard the first \" */
- X return STRING; }
- Xbreak;
- Xcase 52:
- X { line_number++; }
- Xbreak;
- Xcase 53:
- X ;
- Xbreak;
- Xcase 54:
- X { yylval.i = yytext[1]; return CHAR; }
- Xbreak;
- Xcase 55:
- X { return yytext[0]; }
- Xbreak;
- Xcase -1:
- Xbreak;
- Xdefault:
- Xfprintf(yyout,"bad switch yylook %d",nstr);
- X} return(0); }
- X/* end of yylex */
- X#ifdef AMIGA
- Xlong *alloc(n)
- X unsigned n;
- X{
- X return ((long *)malloc (n));
- X}
- X#endif
- Xint yyvstop[] ={
- X0,
- X
- X55,
- X0,
- X
- X53,
- X55,
- X0,
- X
- X52,
- X0,
- X
- X55,
- X0,
- X
- X55,
- X0,
- X
- X50,
- X55,
- X0,
- X
- X55,
- X0,
- X
- X55,
- X0,
- X
- X55,
- X0,
- X
- X55,
- X0,
- X
- X55,
- X0,
- X
- X55,
- X0,
- X
- X55,
- X0,
- X
- X55,
- X0,
- X
- X55,
- X0,
- X
- X55,
- X0,
- X
- X55,
- X0,
- X
- X55,
- X0,
- X
- X55,
- X0,
- X
- X55,
- X0,
- X
- X55,
- X0,
- X
- X55,
- X0,
- X
- X55,
- X0,
- X
- X55,
- X0,
- X
- X55,
- X0,
- X
- X55,
- X0,
- X
- X55,
- X0,
- X
- X55,
- X0,
- X
- X55,
- X0,
- X
- X55,
- X0,
- X
- X55,
- X0,
- X
- X55,
- X0,
- X
- X1,
- X52,
- X0,
- X
- X53,
- X55,
- X0,
- X
- X55,
- X0,
- X
- X55,
- X0,
- X
- X55,
- X0,
- X
- X53,
- X0,
- X
- X51,
- X0,
- X
- X50,
- X0,
- X
- X48,
- X0,
- X
- X3,
- X0,
- X
- X1,
- X0,
- X
- X53,
- X0,
- X
- X1,
- X3,
- X0,
- X
- X54,
- X0,
- X
- X43,
- X0,
- X
- X41,
- X0,
- X
- X39,
- X0,
- X
- X11,
- X0,
- X
- X4,
- X0,
- X
- X21,
- X0,
- X
- X10,
- X0,
- X
- X49,
- X0,
- X
- X28,
- X0,
- X
- X36,
- X0,
- X
- X22,
- X0,
- X
- X30,
- X0,
- X
- X7,
- X0,
- X
- X18,
- X0,
- X
- X5,
- X0,
- X
- X35,
- X0,
- X
- X47,
- X0,
- X
- X45,
- X0,
- X
- X27,
- X0,
- X
- X34,
- X0,
- X
- X37,
- X0,
- X
- X29,
- X0,
- X
- X42,
- X0,
- X
- X19,
- X0,
- X
- X8,
- X0,
- X
- X14,
- X0,
- X
- X40,
- X0,
- X
- X26,
- X0,
- X
- X38,
- X0,
- X
- X23,
- X0,
- X
- X24,
- X0,
- X
- X25,
- X0,
- X
- X32,
- X0,
- X
- X31,
- X0,
- X
- X46,
- X0,
- X
- X9,
- X0,
- X
- X33,
- X0,
- X
- X44,
- X0,
- X
- X2,
- X0,
- X
- X6,
- X0,
- X
- X13,
- X0,
- X
- X12,
- X0,
- X
- X20,
- X0,
- X
- X17,
- X0,
- X
- X15,
- X0,
- X
- X16,
- X0,
- X0};
- X# define YYTYPE int
- Xstruct yywork { YYTYPE verify, advance; } yycrank[] ={
- X0,0, 0,0, 1,5, 0,0,
- X0,0, 0,0, 0,0, 0,0,
- X8,43, 0,0, 1,6, 1,7,
- X9,45, 0,0, 6,42, 0,0,
- X8,43, 8,43, 0,0, 0,0,
- X9,45, 9,0, 41,94, 0,0,
- X0,0, 0,0, 0,0, 0,0,
- X0,0, 0,0, 0,0, 0,0,
- X0,0, 1,6, 0,0, 1,8,
- X1,5, 6,42, 0,0, 8,43,
- X1,9, 8,44, 8,43, 9,45,
- X41,95, 9,45, 9,45, 41,95,
- X45,96, 1,10, 0,0, 0,0,
- X0,0, 0,0, 0,0, 8,43,
- X0,0, 0,0, 0,0, 9,45,
- X0,0, 0,0, 0,0, 0,0,
- X0,0, 0,0, 1,11, 14,51,
- X15,53, 1,12, 13,50, 14,52,
- X1,13, 17,56, 36,89, 49,99,
- X51,101, 1,14, 1,15, 1,16,
- X1,17, 11,47, 15,54, 1,18,
- X12,48, 1,19, 16,55, 12,49,
- X2,5, 18,57, 19,60, 40,93,
- X47,97, 18,58, 48,98, 50,100,
- X2,6, 2,7, 1,20, 1,21,
- X1,22, 1,23, 1,24, 18,59,
- X24,68, 34,86, 52,102, 53,103,
- X54,104, 1,25, 1,26, 1,27,
- X1,28, 1,29, 20,61, 1,30,
- X1,31, 1,32, 1,33, 2,6,
- X1,34, 2,8, 2,35, 23,67,
- X21,62, 26,73, 2,9, 21,63,
- X29,78, 32,83, 2,5, 55,105,
- X2,5, 2,5, 28,76, 2,10,
- X10,46, 10,46, 10,46, 10,46,
- X10,46, 10,46, 10,46, 10,46,
- X10,46, 10,46, 22,64, 27,74,
- X28,77, 22,65, 56,106, 30,79,
- X2,11, 22,66, 31,81, 2,12,
- X57,107, 27,75, 2,13, 30,80,
- X58,108, 31,82, 2,5, 2,14,
- X2,36, 2,16, 2,17, 59,109,
- X25,69, 2,18, 2,5, 2,19,
- X25,70, 33,84, 60,110, 33,85,
- X25,71, 62,113, 61,111, 2,5,
- X63,114, 64,115, 25,72, 65,116,
- X2,20, 2,21, 2,22, 2,23,
- X2,24, 61,112, 66,117, 3,37,
- X67,118, 68,119, 69,120, 2,25,
- X2,26, 2,27, 2,28, 2,29,
- X35,87, 2,30, 2,31, 2,32,
- X2,33, 70,121, 2,34, 71,122,
- X35,87, 35,88, 2,5, 2,5,
- X2,5, 3,38, 72,123, 73,124,
- X3,39, 74,125, 75,126, 76,128,
- X3,9, 77,129, 78,130, 79,131,
- X80,132, 81,133, 82,134, 83,135,
- X84,136, 86,137, 89,138, 35,87,
- X75,127, 35,87, 35,87, 93,139,
- X97,140, 98,141, 99,142, 95,94,
- X89,103, 100,143, 101,144, 102,145,
- X103,146, 104,147, 3,11, 35,87,
- X105,148, 3,12, 3,40, 106,149,
- X3,13, 107,150, 108,151, 109,152,
- X110,153, 3,14, 3,15, 3,16,
- X3,17, 95,95, 111,154, 3,18,
- X95,95, 3,19, 112,155, 113,156,
- X114,157, 115,158, 116,159, 117,160,
- X118,161, 119,162, 121,163, 123,164,
- X124,165, 4,37, 3,20, 3,21,
- X3,22, 3,23, 3,24, 125,166,
- X126,167, 127,168, 128,169, 129,170,
- X130,171, 3,25, 3,26, 3,27,
- X3,28, 3,29, 131,172, 3,30,
- X3,31, 3,32, 3,33, 4,38,
- X3,34, 132,173, 4,41, 133,174,
- X134,175, 136,176, 4,9, 137,177,
- X138,178, 139,179, 4,39, 140,180,
- X4,39, 4,39, 142,181, 143,182,
- X144,183, 145,184, 146,185, 147,186,
- X148,187, 149,188, 150,189, 151,190,
- X154,191, 155,192, 156,193, 157,194,
- X158,195, 159,196, 160,197, 164,198,
- X4,11, 165,199, 166,200, 4,12,
- X4,40, 167,201, 4,13, 168,202,
- X169,203, 171,204, 4,39, 4,14,
- X4,36, 4,16, 4,17, 172,205,
- X173,206, 4,18, 4,39, 4,19,
- X174,207, 175,208, 176,209, 179,210,
- X181,211, 182,212, 183,213, 4,39,
- X185,214, 186,215, 38,42, 38,90,
- X4,20, 4,21, 4,22, 4,23,
- X4,24, 187,216, 188,217, 189,218,
- X190,219, 193,220, 194,221, 4,25,
- X4,26, 4,27, 4,28, 4,29,
- X195,222, 4,30, 4,31, 4,32,
- X4,33, 38,91, 4,34, 39,90,
- X38,92, 197,223, 4,39, 4,39,
- X4,39, 198,224, 199,225, 200,226,
- X38,92, 201,227, 38,92, 38,92,
- X203,228, 205,229, 207,230, 210,231,
- X211,232, 212,233, 214,234, 215,235,
- X216,236, 39,92, 218,237, 225,238,
- X39,92, 226,239, 231,240, 232,241,
- X233,242, 234,243, 236,244, 241,248,
- X39,92, 244,249, 39,92, 39,92,
- X237,245, 245,250, 237,246, 237,247,
- X38,92, 246,251, 247,252, 248,253,
- X249,254, 250,255, 251,256, 252,257,
- X38,92, 254,258, 255,259, 256,260,
- X257,261, 258,262, 259,263, 260,264,
- X261,265, 38,92, 263,266, 264,267,
- X265,268, 266,269, 267,270, 269,271,
- X39,92, 0,0, 0,0, 0,0,
- X0,0, 0,0, 0,0, 0,0,
- X39,92, 0,0, 0,0, 0,0,
- X0,0, 0,0, 0,0, 0,0,
- X0,0, 39,92, 0,0, 0,0,
- X0,0, 0,0, 0,0, 0,0,
- X38,92, 38,92, 38,92, 0,0,
- X0,0, 0,0, 0,0, 0,0,
- X0,0, 0,0, 0,0, 0,0,
- X0,0, 0,0, 0,0, 0,0,
- X0,0, 0,0, 0,0, 0,0,
- X0,0, 0,0, 0,0, 0,0,
- X39,92, 39,92, 39,92, 0,0,
- X0,0};
- Xstruct yysvf yysvec[] ={
- X0, 0, 0,
- Xyycrank+-1, 0, 0,
- Xyycrank+-87, 0, 0,
- Xyycrank+-181, yysvec+1, 0,
- Xyycrank+-267, yysvec+2, 0,
- Xyycrank+0, 0, yyvstop+1,
- Xyycrank+5, 0, yyvstop+3,
- Xyycrank+0, 0, yyvstop+6,
- Xyycrank+-7, 0, yyvstop+8,
- Xyycrank+-11, 0, yyvstop+10,
- Xyycrank+88, 0, yyvstop+12,
- Xyycrank+5, 0, yyvstop+15,
- Xyycrank+5, 0, yyvstop+17,
- Xyycrank+1, 0, yyvstop+19,
- Xyycrank+2, 0, yyvstop+21,
- Xyycrank+3, 0, yyvstop+23,
- Xyycrank+7, 0, yyvstop+25,
- Xyycrank+7, 0, yyvstop+27,
- Xyycrank+24, 0, yyvstop+29,
- Xyycrank+8, 0, yyvstop+31,
- Xyycrank+6, 0, yyvstop+33,
- Xyycrank+13, 0, yyvstop+35,
- Xyycrank+45, 0, yyvstop+37,
- Xyycrank+12, 0, yyvstop+39,
- Xyycrank+7, 0, yyvstop+41,
- Xyycrank+71, 0, yyvstop+43,
- Xyycrank+14, 0, yyvstop+45,
- Xyycrank+46, 0, yyvstop+47,
- Xyycrank+36, 0, yyvstop+49,
- Xyycrank+20, 0, yyvstop+51,
- Xyycrank+54, 0, yyvstop+53,
- Xyycrank+50, 0, yyvstop+55,
- Xyycrank+18, 0, yyvstop+57,
- Xyycrank+63, 0, yyvstop+59,
- Xyycrank+4, 0, yyvstop+61,
- Xyycrank+-199, 0, yyvstop+63,
- Xyycrank+9, yysvec+15, yyvstop+65,
- Xyycrank+0, 0, yyvstop+67,
- Xyycrank+353, 0, yyvstop+70,
- Xyycrank+377, 0, yyvstop+73,
- Xyycrank+13, 0, yyvstop+75,
- Xyycrank+-12, yysvec+35, yyvstop+77,
- Xyycrank+0, yysvec+6, yyvstop+79,
- Xyycrank+0, yysvec+8, 0,
- Xyycrank+0, 0, yyvstop+81,
- Xyycrank+9, 0, 0,
- Xyycrank+0, yysvec+10, yyvstop+83,
- Xyycrank+8, 0, 0,
- Xyycrank+15, 0, 0,
- Xyycrank+10, 0, 0,
- Xyycrank+16, 0, 0,
- Xyycrank+8, 0, 0,
- Xyycrank+20, 0, 0,
- Xyycrank+17, 0, 0,
- Xyycrank+30, 0, 0,
- Xyycrank+53, 0, 0,
- Xyycrank+76, 0, 0,
- Xyycrank+78, 0, 0,
- Xyycrank+89, 0, 0,
- Xyycrank+88, 0, 0,
- Xyycrank+109, 0, 0,
- Xyycrank+73, 0, 0,
- Xyycrank+61, 0, 0,
- Xyycrank+69, 0, 0,
- Xyycrank+71, 0, 0,
- Xyycrank+86, 0, 0,
- Xyycrank+79, 0, 0,
- Xyycrank+73, 0, 0,
- Xyycrank+78, 0, 0,
- Xyycrank+75, 0, 0,
- Xyycrank+103, 0, 0,
- Xyycrank+91, 0, 0,
- Xyycrank+115, 0, 0,
- Xyycrank+105, 0, 0,
- Xyycrank+100, 0, 0,
- Xyycrank+118, 0, 0,
- Xyycrank+113, 0, 0,
- Xyycrank+120, 0, 0,
- Xyycrank+125, 0, 0,
- Xyycrank+113, 0, 0,
- Xyycrank+121, 0, 0,
- Xyycrank+111, 0, 0,
- Xyycrank+109, 0, 0,
- Xyycrank+115, 0, 0,
- Xyycrank+120, 0, 0,
- Xyycrank+0, 0, yyvstop+85,
- Xyycrank+114, 0, 0,
- Xyycrank+0, yysvec+35, 0,
- Xyycrank+0, 0, yyvstop+87,
- Xyycrank+150, 0, 0,
- Xyycrank+0, 0, yyvstop+89,
- Xyycrank+0, yysvec+38, yyvstop+91,
- Xyycrank+0, yysvec+39, 0,
- Xyycrank+167, 0, 0,
- Xyycrank+0, 0, yyvstop+93,
- Xyycrank+-229, yysvec+35, 0,
- Xyycrank+0, 0, yyvstop+96,
- Xyycrank+171, 0, 0,
- Xyycrank+155, 0, 0,
- Xyycrank+151, 0, 0,
- Xyycrank+164, 0, 0,
- Xyycrank+174, 0, 0,
- Xyycrank+174, 0, 0,
- Xyycrank+175, 0, 0,
- Xyycrank+162, 0, 0,
- Xyycrank+153, 0, 0,
- Xyycrank+182, 0, 0,
- Xyycrank+185, 0, 0,
- Xyycrank+181, 0, 0,
- Xyycrank+178, 0, 0,
- Xyycrank+176, 0, 0,
- Xyycrank+159, 0, 0,
- Xyycrank+169, 0, 0,
- Xyycrank+151, 0, 0,
- Xyycrank+161, 0, 0,
- Xyycrank+153, 0, 0,
- Xyycrank+159, 0, 0,
- Xyycrank+156, 0, 0,
- Xyycrank+162, 0, 0,
- Xyycrank+157, 0, 0,
- Xyycrank+0, 0, yyvstop+98,
- Xyycrank+158, 0, 0,
- Xyycrank+0, 0, yyvstop+100,
- Xyycrank+168, 0, 0,
- Xyycrank+161, 0, 0,
- Xyycrank+167, 0, 0,
- Xyycrank+173, 0, 0,
- Xyycrank+169, 0, 0,
- Xyycrank+185, 0, 0,
- Xyycrank+177, 0, 0,
- Xyycrank+189, 0, 0,
- Xyycrank+194, 0, 0,
- Xyycrank+197, 0, 0,
- Xyycrank+198, 0, 0,
- Xyycrank+188, 0, 0,
- Xyycrank+0, 0, yyvstop+102,
- Xyycrank+200, 0, 0,
- Xyycrank+191, 0, 0,
- Xyycrank+298, 0, 0,
- Xyycrank+232, 0, 0,
- Xyycrank+229, 0, 0,
- Xyycrank+0, 0, yyvstop+104,
- Xyycrank+248, 0, 0,
- Xyycrank+246, 0, 0,
- Xyycrank+247, 0, 0,
- Xyycrank+241, 0, 0,
- Xyycrank+231, 0, yyvstop+106,
- Xyycrank+235, 0, 0,
- Xyycrank+252, 0, 0,
- Xyycrank+254, 0, 0,
- Xyycrank+243, 0, 0,
- Xyycrank+244, 0, 0,
- Xyycrank+0, 0, yyvstop+108,
- Xyycrank+0, 0, yyvstop+110,
- Xyycrank+214, 0, 0,
- Xyycrank+211, 0, 0,
- Xyycrank+215, 0, 0,
- Xyycrank+226, 0, 0,
- Xyycrank+227, 0, 0,
- Xyycrank+214, 0, 0,
- Xyycrank+229, 0, 0,
- Xyycrank+0, 0, yyvstop+112,
- Xyycrank+0, 0, yyvstop+114,
- Xyycrank+0, 0, yyvstop+116,
- Xyycrank+230, 0, 0,
- Xyycrank+217, 0, 0,
- Xyycrank+220, 0, 0,
- Xyycrank+226, 0, 0,
- Xyycrank+235, 0, 0,
- Xyycrank+241, 0, 0,
- Xyycrank+0, 0, yyvstop+118,
- Xyycrank+240, 0, 0,
- Xyycrank+236, 0, 0,
- Xyycrank+232, 0, 0,
- Xyycrank+242, 0, 0,
- Xyycrank+249, 0, 0,
- Xyycrank+238, 0, 0,
- Xyycrank+0, 0, yyvstop+120,
- Xyycrank+0, 0, yyvstop+122,
- Xyycrank+290, 0, 0,
- Xyycrank+0, 0, yyvstop+124,
- Xyycrank+274, 0, 0,
- Xyycrank+273, 0, 0,
- Xyycrank+276, 0, 0,
- Xyycrank+0, 0, yyvstop+126,
- Xyycrank+295, 0, 0,
- Xyycrank+292, 0, 0,
- Xyycrank+296, 0, 0,
- Xyycrank+286, 0, 0,
- Xyycrank+294, 0, 0,
- Xyycrank+294, 0, 0,
- Xyycrank+0, 0, yyvstop+128,
- Xyycrank+0, 0, yyvstop+130,
- Xyycrank+264, 0, 0,
- Xyycrank+264, 0, 0,
- Xyycrank+266, 0, 0,
- Xyycrank+0, 0, yyvstop+132,
- Xyycrank+289, 0, 0,
- Xyycrank+293, 0, 0,
- Xyycrank+293, 0, 0,
- Xyycrank+298, 0, 0,
- Xyycrank+283, 0, 0,
- Xyycrank+0, 0, yyvstop+134,
- Xyycrank+284, 0, 0,
- Xyycrank+0, 0, yyvstop+136,
- Xyycrank+292, 0, 0,
- Xyycrank+0, 0, yyvstop+138,
- Xyycrank+301, 0, 0,
- Xyycrank+0, 0, yyvstop+140,
- Xyycrank+0, 0, yyvstop+142,
- Xyycrank+323, 0, 0,
- Xyycrank+331, 0, 0,
- Xyycrank+323, 0, 0,
- Xyycrank+0, 0, yyvstop+144,
- Xyycrank+330, 0, 0,
- Xyycrank+325, 0, 0,
- Xyycrank+337, 0, 0,
- Xyycrank+0, 0, yyvstop+146,
- Xyycrank+315, 0, 0,
- Xyycrank+0, 0, yyvstop+148,
- Xyycrank+0, 0, yyvstop+150,
- Xyycrank+0, 0, yyvstop+152,
- Xyycrank+0, 0, yyvstop+154,
- Xyycrank+0, 0, yyvstop+156,
- Xyycrank+0, 0, yyvstop+158,
- Xyycrank+297, 0, 0,
- Xyycrank+305, 0, 0,
- Xyycrank+0, 0, yyvstop+160,
- Xyycrank+0, 0, yyvstop+162,
- Xyycrank+0, 0, yyvstop+164,
- Xyycrank+0, 0, yyvstop+166,
- Xyycrank+404, 0, 0,
- Xyycrank+347, 0, 0,
- Xyycrank+327, 0, 0,
- Xyycrank+342, 0, 0,
- Xyycrank+0, 0, yyvstop+168,
- Xyycrank+347, 0, 0,
- Xyycrank+347, 0, 0,
- Xyycrank+0, 0, yyvstop+170,
- Xyycrank+0, 0, yyvstop+172,
- Xyycrank+0, 0, yyvstop+174,
- Xyycrank+348, 0, 0,
- Xyycrank+0, 0, yyvstop+176,
- Xyycrank+0, 0, yyvstop+178,
- Xyycrank+356, 0, 0,
- Xyycrank+346, 0, 0,
- Xyycrank+363, 0, 0,
- Xyycrank+354, 0, 0,
- Xyycrank+362, 0, 0,
- Xyycrank+366, 0, 0,
- Xyycrank+355, 0, 0,
- Xyycrank+360, 0, 0,
- Xyycrank+370, 0, 0,
- Xyycrank+0, 0, yyvstop+180,
- Xyycrank+361, 0, 0,
- Xyycrank+355, 0, 0,
- Xyycrank+370, 0, 0,
- Xyycrank+373, 0, 0,
- Xyycrank+372, 0, 0,
- Xyycrank+358, 0, 0,
- Xyycrank+376, 0, 0,
- Xyycrank+375, 0, 0,
- Xyycrank+0, 0, yyvstop+182,
- Xyycrank+377, 0, 0,
- Xyycrank+363, 0, 0,
- Xyycrank+365, 0, 0,
- Xyycrank+367, 0, 0,
- Xyycrank+367, 0, 0,
- Xyycrank+0, 0, yyvstop+184,
- Xyycrank+368, 0, 0,
- Xyycrank+0, 0, yyvstop+186,
- Xyycrank+0, 0, yyvstop+188,
- X0, 0, 0};
- Xstruct yywork *yytop = yycrank+502;
- Xstruct yysvf *yybgin = yysvec+1;
- Xchar yymatch[] ={
- X00 ,01 ,01 ,01 ,01 ,01 ,01 ,01 ,
- X01 ,011 ,012 ,01 ,01 ,01 ,01 ,01 ,
- X01 ,01 ,01 ,01 ,01 ,01 ,01 ,01 ,
- X01 ,01 ,01 ,01 ,01 ,01 ,01 ,01 ,
- X040 ,01 ,'"' ,'#' ,01 ,01 ,01 ,01 ,
- X01 ,01 ,01 ,'#' ,01 ,'#' ,'#' ,01 ,
- X'0' ,'0' ,'0' ,'0' ,'0' ,'0' ,'0' ,'0' ,
- X'0' ,'0' ,01 ,01 ,01 ,01 ,01 ,01 ,
- X01 ,01 ,01 ,01 ,01 ,01 ,01 ,01 ,
- X01 ,01 ,01 ,'#' ,01 ,01 ,01 ,01 ,
- X01 ,01 ,01 ,'#' ,01 ,01 ,01 ,01 ,
- X01 ,01 ,01 ,01 ,'#' ,01 ,01 ,01 ,
- X01 ,01 ,01 ,01 ,01 ,01 ,01 ,01 ,
- X01 ,01 ,01 ,01 ,01 ,01 ,01 ,01 ,
- X01 ,01 ,01 ,01 ,01 ,01 ,01 ,01 ,
- X01 ,01 ,01 ,'#' ,'#' ,'#' ,01 ,01 ,
- X0};
- Xchar yyextra[] ={
- X0,0,0,0,0,0,0,0,
- X0,0,0,0,0,0,0,0,
- X0,0,0,0,0,0,0,0,
- X0,0,0,0,0,0,0,0,
- X0,0,0,0,0,0,0,0,
- X0,0,0,0,0,0,0,0,
- X0,0,0,0,0,0,0,0,
- X0};
- X/* ncform 4.1 83/08/11 */
- X
- Xint yylineno =1;
- X# define YYU(x) x
- X# define NLSTATE yyprevious=YYNEWLINE
- Xchar yytext[YYLMAX];
- Xstruct yysvf *yylstate [YYLMAX], **yylsp, **yyolsp;
- Xchar yysbuf[YYLMAX];
- Xchar *yysptr = yysbuf;
- Xint *yyfnd;
- Xextern struct yysvf *yyestate;
- Xint yyprevious = YYNEWLINE;
- Xyylook(){
- X register struct yysvf *yystate, **lsp;
- X register struct yywork *yyt;
- X struct yysvf *yyz;
- X int yych;
- X struct yywork *yyr;
- X# ifdef LEXDEBUG
- X int debug;
- X# endif
- X char *yylastch;
- X /* start off machines */
- X# ifdef LEXDEBUG
- X debug = 0;
- X# endif
- X if (!yymorfg)
- X yylastch = yytext;
- X else {
- X yymorfg=0;
- X yylastch = yytext+yyleng;
- X }
- X for(;;){
- X lsp = yylstate;
- X yyestate = yystate = yybgin;
- X if (yyprevious==YYNEWLINE) yystate++;
- X for (;;){
- X# ifdef LEXDEBUG
- X if(debug)fprintf(yyout,"state %d\n",yystate-yysvec-1);
- X# endif
- X yyt = yystate->yystoff;
- X if(yyt == yycrank){ /* may not be any transitions */
- X yyz = yystate->yyother;
- X if(yyz == 0)break;
- X if(yyz->yystoff == yycrank)break;
- X }
- X *yylastch++ = yych = input();
- X tryagain:
- X# ifdef LEXDEBUG
- X if(debug){
- X fprintf(yyout,"char ");
- X allprint(yych);
- X putchar('\n');
- X }
- X# endif
- X yyr = yyt;
- X if ( (int)yyt > (int)yycrank){
- X yyt = yyr + yych;
- X if (yyt <= yytop && yyt->verify+yysvec == yystate){
- X if(yyt->advance+yysvec == YYLERR) /* error transitions */
- X {unput(*--yylastch);break;}
- X *lsp++ = yystate = yyt->advance+yysvec;
- X goto contin;
- X }
- X }
- X# ifdef YYOPTIM
- X else if((int)yyt < (int)yycrank) { /* r < yycrank */
- X yyt = yyr = yycrank+(yycrank-yyt);
- X# ifdef LEXDEBUG
- X if(debug)fprintf(yyout,"compressed state\n");
- X# endif
- X yyt = yyt + yych;
- X if(yyt <= yytop && yyt->verify+yysvec == yystate){
- X if(yyt->advance+yysvec == YYLERR) /* error transitions */
- X {unput(*--yylastch);break;}
- X *lsp++ = yystate = yyt->advance+yysvec;
- X goto contin;
- X }
- X yyt = yyr + YYU(yymatch[yych]);
- X# ifdef LEXDEBUG
- X if(debug){
- X fprintf(yyout,"try fall back character ");
- X allprint(YYU(yymatch[yych]));
- X putchar('\n');
- X }
- X# endif
- X if(yyt <= yytop && yyt->verify+yysvec == yystate){
- X if(yyt->advance+yysvec == YYLERR) /* error transition */
- X {unput(*--yylastch);break;}
- X *lsp++ = yystate = yyt->advance+yysvec;
- X goto contin;
- X }
- X }
- X if ((yystate = yystate->yyother) && (yyt= yystate->yystoff) != yycrank){
- X# ifdef LEXDEBUG
- X if(debug)fprintf(yyout,"fall back to state %d\n",yystate-yysvec-1);
- X# endif
- X goto tryagain;
- X }
- X# endif
- X else
- X {unput(*--yylastch);break;}
- X contin:
- X# ifdef LEXDEBUG
- X if(debug){
- X fprintf(yyout,"state %d char ",yystate-yysvec-1);
- X allprint(yych);
- X putchar('\n');
- X }
- X# endif
- X ;
- X }
- X# ifdef LEXDEBUG
- X if(debug){
- X fprintf(yyout,"stopped at %d with ",*(lsp-1)-yysvec-1);
- X allprint(yych);
- X putchar('\n');
- X }
- X# endif
- X while (lsp-- > yylstate){
- X *yylastch-- = 0;
- X if (*lsp != 0 && (yyfnd= (*lsp)->yystops) && *yyfnd > 0){
- X yyolsp = lsp;
- X if(yyextra[*yyfnd]){ /* must backup */
- X while(yyback((*lsp)->yystops,-*yyfnd) != 1 && lsp > yylstate){
- X lsp--;
- X unput(*yylastch--);
- X }
- X }
- X yyprevious = YYU(*yylastch);
- X yylsp = lsp;
- X yyleng = yylastch-yytext+1;
- X yytext[yyleng] = 0;
- X# ifdef LEXDEBUG
- X if(debug){
- X fprintf(yyout,"\nmatch ");
- X sprint(yytext);
- X fprintf(yyout," action %d\n",*yyfnd);
- X }
- X# endif
- X return(*yyfnd++);
- X }
- X unput(*yylastch);
- X }
- X if (yytext[0] == 0 /* && feof(yyin) */)
- X {
- X yysptr=yysbuf;
- X return(0);
- X }
- X yyprevious = yytext[0] = input();
- X if (yyprevious>0)
- X output(yyprevious);
- X yylastch=yytext;
- X# ifdef LEXDEBUG
- X if(debug)putchar('\n');
- X# endif
- X }
- X }
- Xyyback(p, m)
- X int *p;
- X{
- Xif (p==0) return(0);
- Xwhile (*p)
- X {
- X if (*p++ == m)
- X return(1);
- X }
- Xreturn(0);
- X}
- X /* the following are only used in the lex library */
- Xyyinput(){
- X return(input());
- X }
- Xyyoutput(c)
- X int c; {
- X output(c);
- X }
- Xyyunput(c)
- X int c; {
- X unput(c);
- X }
- END_OF_FILE
- if test 21018 -ne `wc -c <'src/lev_lex.c'`; then
- echo shar: \"'src/lev_lex.c'\" unpacked with wrong size!
- fi
- # end of 'src/lev_lex.c'
- echo shar: End of archive 27 \(of 30\).
- cp /dev/null ark27isdone
- MISSING=""
- for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 ; do
- if test ! -f ark${I}isdone ; then
- MISSING="${MISSING} ${I}"
- fi
- done
- if test "${MISSING}" = "" ; then
- echo You have unpacked all 30 archives.
- rm -f ark[1-9]isdone ark[1-9][0-9]isdone
- else
- echo You still need to unpack the following archives:
- echo " " ${MISSING}
- fi
- ## End of shell archive.
- exit 0
-